package com.zhongwang.mms.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelImportUtil {
    /**
     * 导入 Excel 文件
     * @param inputStream 上传文件的输入流
     * @param clazz 实体类Class
     * @return 解析后的数据列表
     */
    public static <T> List<T> importExcel(InputStream inputStream, Class<T> clazz) {
        // 创建监听器实例
        ExcelImportListener<T> listener = new ExcelImportListener<>();

        // 构建读入器并执行读取
        EasyExcel.read(inputStream, clazz, listener)
                .sheet() // 读取第一个工作表
                .doRead();

        // 从监听器中获取解析后的数据
        return listener.getDataList();
    }

    /**
     * Excel 导入监听器
     * 注意：这个类在 2.1.6 中通常需要是 public 的，或者在同一个包下
     */
    public static class ExcelImportListener<T> extends AnalysisEventListener<T> {

        // 存储解析出的数据
        private final List<T> dataList = new ArrayList<>();

        /**
         * 每解析一行，该方法就会被调用一次
         * @param data 解析出的一行数据
         * @param context 解析上下文
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
            // 在这里可以对 data 进行校验
            if (data != null) {
                dataList.add(data);
            }
        }

        /**
         * 所有数据解析完成后，该方法会被调用
         * @param context 解析上下文
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 可以在这里做一些收尾工作，比如数据汇总
        }

        /**
         * 获取解析后的数据列表
         * @return 数据列表
         */
        public List<T> getDataList() {
            return dataList;
        }
    }
}
